package com.xique.park.service.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xique.common.core.web.domain.PageResult;
import com.xique.park.bean.domain.ParkStatisticsIncome;
import com.xique.park.bean.domain.PayOrder;
import com.xique.park.bean.dto.PayOrderDto;
import com.xique.park.bean.request.web.payorder.PayOrderRequest;
import com.xique.park.bean.vo.web.payOrder.PayOrderVo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 支付记录Service接口
 *
 * @author ww
 * @date 2021-12-22
 */
public interface IPayOrderService extends IService<PayOrder> {

    /**
     * 查询列表
     *
     * @param tPayOrder
     * @return 支付记录集合
     */
    List<PayOrder> selectTPayOrderList(PayOrder tPayOrder);

    /**
     * 新增支付记录
     *
     * @param tPayOrder 支付记录
     * @return 结果
     */
    int insertTPayOrder(PayOrder tPayOrder);

    /**
     * 批量新增
     *
     * @param list 支付记录列表
     * @return 新增结果
     */
    int batchInsert(List<PayOrder> list);

    /**
     * 批量更新
     *
     * @param list 支付记录列表
     * @return 更新结果
     */
    int batchUpdate(List<PayOrder> list);

    /**
     * 查询今天的订单数量和订单收入
     *
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return 订单统计数据 {@link PayOrderDto}
     */
    PayOrderDto selectParkingOrderByToday(Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 按年月统计停车场总收入
     *
     * @param year          年
     * @param startMonth    开始月份
     * @param endMonth      结束月份
     * @param parkId        项目ID
     * @param payStatusList 支付状态
     * @return 从本月开始，往前4个月的数据
     */
    List<PayOrderDto> selectParkingOrderCountByMonth(Integer year, Integer startMonth, Integer endMonth, Long parkId, List<String> payStatusList);

    /**
     * 按年月统计停车场总收入
     *
     * @param year       年
     * @param startMonth 开始月份
     * @param endMonth   结束月份
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return 从本月开始，往前4个月的数据
     */
    List<PayOrderDto> selectParkingOrderCountByMonth(Integer year, Integer startMonth, Integer endMonth, Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 统计停车场收入排行榜
     *
     * @param limit      取前几条
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return 停车场收入排行榜
     */
    List<PayOrderDto> selectParkingRevenueRanking(Integer limit, Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 查询年度总金额
     *
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return 年度总金额
     */
    BigDecimal selectTotalAnnualAmount(Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 统计支付方式分析（某个时间段内的）
     *
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return /
     */
    PayOrderDto selectPaymentMethodOnThreeDay(String startTime, String endTime, Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 统计某个时间段内的停车时常数据
     *
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return /
     */
    PayOrderDto selectParkingDuration(String startTime, String endTime, Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 统计某个区域内的今日支付方式
     *
     * @param province   省编码
     * @param city       市编码
     * @param district   区县编码
     * @param deptId     服务商ID
     * @param parkInfoId 项目ID
     * @return 今日支付方式统计
     */
    PayOrderDto selectPaymentMethodToday(Integer province, Integer city, Integer district, Long deptId, Long parkInfoId);

    /**
     * 查询支付记录列表
     *
     * @param payOrder 支付记录
     * @return 支付记录集合
     */
    List<PayOrder> selectPayOrderList(PayOrder payOrder);

    /**
     * 分页查询支付记录列表
     *
     * @param payOrderRequest 查询条件
     * @return 支付记录列表
     */
    PageResult selectPageList(PayOrderRequest payOrderRequest);

    /**
     * 根据停车流水号查询支付记录
     *
     * @param parkId        parkId
     * @param parkingSerial 停车流水号
     * @return 支付记录
     */
    List<PayOrderDto> selectPayOrderByParkingSerial(Long parkId, String parkingSerial);

    /**
     * 根据值班员ID获取对应的统计信息
     *
     * @param clientUserId 值班员ID
     * @param payTypeList  支付方式
     * @param beginTime    开始时间
     * @param endTime      结束时间
     * @return 统计信息
     */
    PayOrderVo selectStatisticsInfoByClientUserId(Long clientUserId, List<String> payTypeList, String beginTime, String endTime);

    /**
     * 根据岗亭用户ID更新现金已结算金额
     *
     * @param clientUserId 岗亭用户ID
     */
    void updateCashSettlementFeeByClientUserId(Long clientUserId);

    /**
     * 统计电子支付金额
     *
     * @param parkId parkId
     * @return java.lang.Long
     * @author shd
     * @date 2021/11/4 10:42
     */
    Double selectElectronicStatistic(Long parkId);

    /**
     * 统计现金收费金额
     *
     * @param parkId parkId
     * @return java.lang.Long
     * @author shd
     * @date 2021/11/4 10:42
     */
    Double selectCashStatistic(Long parkId);

    /**
     * 统计未收金额
     *
     * @param parkId parkId
     * @return java.lang.Long
     * @author shd
     * @date 2021/11/4 10:42
     */
    Double selectWaitStatistic(Long parkId);

    /**
     * 统计免费金额
     *
     * @param parkId parkId
     * @return java.lang.Long
     * @author shd
     * @date 2021/11/4 10:42
     */
    Double selectFreeStatistic(Long parkId);

    /**
     * 统计现金收费金额
     *
     * @param parkId 项目id
     * @param userId 管理员用户id
     * @return java.lang.Long
     * @author shd
     * @date 2021/11/4 10:42
     */
    Double selectCashStatisticByUserId(Long parkId, Long userId);

    /**
     * 统计免费金额
     *
     * @param parkId parkId
     * @param userId 管理员用户id
     * @return java.lang.Double
     * @author shd
     * @date 2021/11/9 10:00
     */
    Double selectFreeStatisticByUserId(Long parkId, Long userId);

    /**
     * 根据支付状态、统计车场某个时间段内的收入
     *
     * @param parkId     车场ID
     * @param statusList 支付状态
     * @param starDate   开始时间
     * @param endDate    结束时间
     * @return 统计结果
     */
    PayOrderDto getRevenue(Long parkId, List<String> statusList, Date starDate, Date endDate);

    /**
     * 获取未收费金额信息
     *
     * @param parkId    车场ID
     * @param userId    岗亭值班员ID
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 未收费金额
     */
    BigDecimal selectNoPayFee(Long parkId, Integer userId, String beginTime, String endTime);

    /**
     * 根据支付类型和岗亭用户信息查询支付列表
     *
     * @param clientUserId 岗亭用户id
     * @param plate        车牌号
     * @param payType      支付类型
     * @param pageNum      当前页
     * @param pageSize     每页数量
     * @param beginTime    开始时间
     * @param endTime      结束时间
     * @return 支付记录列表
     */
    PageResult selectPageListByPayType(Long clientUserId, String plate, String payType,
                                       Integer pageNum, Integer pageSize,
                                       String beginTime, String endTime);

    /**
     * 获取免费金额信息
     *
     * @param parkId    车场ID
     * @param userId    岗亭用户ID
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 免费金额
     */
    BigDecimal selectFreeFee(Long parkId, Integer userId, String beginTime, String endTime);

    /**
     * 根据查询条件分页查询未收费列表
     *
     * @param clientUserId 岗亭用户id
     * @param plate        车牌号
     * @param pageNum      当前页
     * @param pageSize     每页数量
     * @param beginTime    开始时间
     * @param endTime      结束时间
     * @return 未收费列表
     */
    PageResult selectPageNoChargeList(Long clientUserId, String plate,
                                      Integer pageNum, Integer pageSize,
                                      String beginTime, String endTime);


    /**
     * 根据车场ID统计当前车场的收入，按日去统计，统计所有的日期
     *
     * @param parkId 车场ID
     * @return 统计结果
     */
    List<ParkStatisticsIncome> selectStatisticsIncomeByDay(Long parkId);

    /**
     * 根据车场ID统计当前车场的收入，统计指定日期
     *
     * @param day    指定日期 yyyy-MM-dd
     * @param parkId 车场ID
     * @return 统计结果
     */
    ParkStatisticsIncome selectStatisticsIncomeByAppointDay(String day, Long parkId);

    /**
     * 按年月统计停车场的支付方式
     *
     * @param year       年
     * @param startMonth 开始月份
     * @param endMonth   结束月份
     * @param parkId     项目ID
     * @return 统计结果
     */
    List<PayOrderDto> selectPayTypeCountByMonth(Integer year, Integer startMonth, Integer endMonth, Long parkId);
}
